/*
通道（channel）是用来传递数据的一个数据结构。

通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。
操作符 <- 用于指定通道的方向，发送或接收。如果未指定方向，则为双向通道。

(c chan<- int) 向chan发送 int类型数据
(c <-chan int) 接收chan中的 int类型数据

完整写法
data, ok := <-ch
data是接收的数据，ok（bool类型）是否接收到数据，可以判断当前channel是否关闭
*/
package main

import (
	"fmt"
	"time"
)

func main() {
	//c := make(chan int) // 不使用带缓冲区的channel
	c := make(chan int, 2) // 使用带缓冲区的channel
	go send(c)
	go recv(c)
	fmt.Println(len(c), cap(c))
	time.Sleep(1 * time.Second)
	close(c)
}

// 只能向chan里send数据
func send(c chan<- int) {
	for i := 0; i < 10; i++ {
		fmt.Println("send ready ", i)
		c <- i
		fmt.Println("send ", i)
	}
}

// 只能接收channel中的数据
func recv(c <-chan int) {
	for i := range c {
		fmt.Println("received ", i)
	}
}
